package cn.wgx.module.file.service;

import cn.wgx.common.base.IBaseService;
import cn.wgx.common.util.StringUtils;
import cn.wgx.module.file.entity.FileInfo;
import cn.wgx.module.file.entity.FileType;
import cn.wgx.module.file.mapper.FileInfoMapper;
import cn.wgx.module.file.util.FileUploadTool;
import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;
import java.util.Date;

/**
 *  上传文件服务接口
 */
public abstract class FileService extends IBaseService<FileInfoMapper, FileInfo> {

    public FileInfo upload(MultipartFile file, String md5) throws Exception {
        //根据前端传来的MD5判断此文件是否已上传过
        if(StringUtils.isNotBlank(md5)){
            FileInfo oldFileInfo = getById(md5);
            if (oldFileInfo != null) {
                return oldFileInfo;
            }
        }
    	//获取文件基础信息
        FileInfo fileInfo = getFileInfo(file);
        //查询数据库是否已上传
        FileInfo oldFileInfo = getById(fileInfo.getFile_id());
        if (oldFileInfo != null) {
            return oldFileInfo;
        }

//        if (!fileInfo.getOriginalName().contains(".")) {
//            throw new IllegalArgumentException("缺少后缀名");
//        }

        //执行上传文件
        doUploadFile(file, fileInfo);
		// 设置文件来源
        fileInfo.setSrc(getFileType().name());
		// 将文件信息保存到数据库
        save(fileInfo);
		// 本地保存文件
//		FileUtil.saveFile(file,fileInfo.getPath());


        return fileInfo;
    }

    protected abstract void doUploadFile(MultipartFile file, FileInfo fileInfo);

    protected abstract boolean doDelete(Serializable id);

    //获取文件上传位置
    protected abstract FileType getFileType();

    protected boolean delete(Serializable id){
        return doDelete(id) && removeById(id);
    }

    private FileInfo getFileInfo(MultipartFile file) throws Exception {
        String md5 = FileUploadTool.fileMd5(file.getInputStream());
        FileInfo fileInfo = new FileInfo();
        fileInfo.setFile_id(md5);// 将文件的md5设置为文件表的id
        fileInfo.setOriginalName(file.getOriginalFilename());
        fileInfo.setContentType(file.getContentType());
        fileInfo.setImg(fileInfo.getContentType().startsWith("image/"));
        fileInfo.setSize(file.getSize());
        fileInfo.setCreateDate(new Date());
        return fileInfo;
    }
}
